/*
 * @(#)EnumUtils.java 1.0 2018-10-26
 *
 * Copyright (c) 2017, YUNXI. All rights reserved.
 * YUNXI PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 */
package com.taldh.utils.enums;

import java.lang.reflect.InvocationTargetException;

/**
 * @author Tianzong
 * @since 0.0.1
 */

public class EnumUtils {

    /**
     * 枚举工具方法，通过这个这个静态方法可以使用ordinal 获取 enumType类型
     * @param enumType 枚举类的class
     * @param ordinal 枚举的原始下标
     * @param <T> 必须是枚举类
     * @return 枚举该下标对应的枚举类型（name）
     */
    public static <T extends Enum<T>> T valueOfOrdinal(Class<T> enumType,
                                                int ordinal) {
        if (!enumType.isEnum()) {
            throw new IllegalArgumentException(
                    enumType + "is not an enum class!");
        }
        T[] constants = enumType.getEnumConstants();
        if (ordinal < 0 || ordinal >= constants.length) {
            throw new IndexOutOfBoundsException(
                    String.format("Invalid ordinal: %d, this ordinal is beyond the arrange of %s",
                            ordinal, enumType.getName())
            );
        }
        return constants[ordinal];
    }
    /**
     * 枚举工具方法，通过这个这个静态方法可以使用ordinal 获取 enumType类型
     * @param enumType 枚举类的class
     * @param code 枚举的code
     * @param <T> 必须是枚举类
     * @return 枚举该下标对应的枚举类型（name）
     */
    public static <T extends Enum<T>> T valueOfCode(Class<T> enumType,
                                                int code) {
        if (!enumType.isEnum()) {
            throw new IllegalArgumentException(
                    enumType + "is not an enum class!");
        }

        try {
            return (T) enumType.getMethod("find", Integer.class).invoke(enumType, code);
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            throw new RuntimeException(
                    String.format("Invalid ordinal: %d, this code is beyond the arrange of %s",
                            code, enumType.getName())
            );
        }
    }

}
